package com.doctracker.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

/**
 * 人员实体类
 * 用于存储人员信息和文件提交状态
 */
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    
    /**
     * 人员姓名
     */
    private String name;
    
    /**
     * 是否已提交文件
     */
    private boolean hasSubmitted;
    
    /**
     * 提交的文件名
     */
    private String fileName;
    
    /**
     * 文件所在的文件夹路径
     */
    private String folderPath;
    
    /**
     * 文件完整路径
     */
    private String filePath;
    
    /**
     * 动态字段存储 - 存储从Excel导入的额外字段
     */
    private java.util.Map<String, String> dynamicFields = new java.util.HashMap<>();
    
    /**
     * 构造函数 - 仅使用姓名
     * @param name 人员姓名
     */
    public Person(String name) {
        this.name = name;
        this.hasSubmitted = false;
    }
    
    /**
     * 获取显示状态文本
     * @return 状态文本
     */
    public String getStatusText() {
        return hasSubmitted ? "✅ 已提交" : "❌ 未提交";
    }
    
    /**
     * 获取显示文本（用于界面显示）
     * @return 显示文本
     */
    public String getDisplayText() {
        if (hasSubmitted && fileName != null) {
            // 提取文件夹名称
            String folderName = getFolderName();
            if (folderName != null && !folderName.isEmpty()) {
                return String.format("%s - %s (%s)", name, fileName, folderName);
            } else {
                return String.format("%s - %s", name, fileName);
            }
        } else {
            return String.format("%s - 未找到文件", name);
        }
    }
    
    /**
     * 获取文件夹名称
     * @return 文件夹名称
     */
    public String getFolderName() {
        if (folderPath == null || folderPath.isEmpty()) {
            return null;
        }
        
        // 提取文件夹名称（最后一级目录名）
        String[] parts = folderPath.replace("\\", "/").split("/");
        return parts.length > 0 ? parts[parts.length - 1] : null;
    }
    
    /**
     * 重置提交状态（用于重新扫描）
     */
    public void resetSubmissionStatus() {
        this.hasSubmitted = false;
        this.fileName = null;
        this.folderPath = null;
        this.filePath = null;
    }
    
    /**
     * 设置动态字段
     * 
     * @param fieldName 字段名
     * @param value 字段值
     */
    public void setDynamicField(String fieldName, String value) {
        if (value != null && !value.trim().isEmpty()) {
            this.dynamicFields.put(fieldName, value.trim());
        }
    }
    
    /**
     * 获取动态字段值
     * 
     * @param fieldName 字段名
     * @return 字段值
     */
    public String getDynamicField(String fieldName) {
        return this.dynamicFields.get(fieldName);
    }
    
    /**
     * 获取所有可用的动态字段名
     * 
     * @return 字段名集合
     */
    public java.util.Set<String> getAvailableFields() {
        return this.dynamicFields.keySet();
    }
    
    /**
     * 获取动态字段映射
     * 
     * @return 动态字段映射
     */
    public java.util.Map<String, String> getDynamicFields() {
        return this.dynamicFields;
    }
    
    /**
     * 设置动态字段映射
     * 
     * @param dynamicFields 动态字段映射
     */
    public void setDynamicFields(java.util.Map<String, String> dynamicFields) {
        this.dynamicFields = dynamicFields != null ? dynamicFields : new java.util.HashMap<>();
    }
} 